import pandas as pd
# 绘图库
import plotly.express as px
import plotly.graph_objects as go
import matplotlib.pyplot as plt

# 2.2 单变量分析
# 这里主要是了解数值型数据的分布情况，同时观察可能需要过滤的离散值
total = pd.read_csv(r'./data/total.csv')
# 通过plotly的直方图来实现，因为特征比较多，加上和鲸在线展示plotly会很卡，所以这里生成html
for i in list(total.columns):
    if i != '客户ID':
        hist_fig = px.histogram(total,x = i,marginal = 'box')
        hist_fig.write_html(f'./data/直方图/{i}.html')
        # hist_fig.show()
print('绘图成功~')

'''
剔除掉“客户ID”特征，还剩下67个特征，数量还是比较多的，根据上述生成的直方图，我们获取了以下信息：
1.有部分特征是存在不合理的“负值”，算是异常值，包括：
'当前设备使用天数','当前手机价格','过去六个月的平均每月使用分钟数','过去六个月的平均每月通话次数','过去六个月的平均月费用','家庭成人人数','每月平均使用分钟数','平均超额费用','平均超额使用分钟数','平均漫游呼叫数','平均语音费用','平均月费用','数据超载的平均费用'
2.一些稍微有价值的信息：
1）语音呼叫次数集中在40-101次；
2）设备使用天数主要在218-343天之间；
3）该数据集的电信客户过去六个月的平均每月使用分钟数集中在0-349min，过去六个月的平均每月通话次数在123次左右，过去六个月的平均月费用主要在31-48元之间；
4）婚姻状况集中在“1”和“3”（因为数据是脱敏的，小编也不太明白是啥含意）；
5）家庭成人人数主要是1-2人；
6）家庭活跃用户数1人最多；
7）“是否翻新机”是二值化特征，集中在0类（盲猜0代表“不是翻新机“）；
8）“是否双频”特征具有3个类别（不同的值）；
9）“手机网络功能”特征有4个类别（不同的值），其中一个类别为-1，数量为220个，不确定是否是离散值；
10）”新手机用户“，”信息库匹配“，”信用卡指示器“0类最多；
11）”账户消费限“也是二值化特征，集中在0类。（盲猜0代表“不限额”）。
'''

# 2.3 双变量分析
# 我们可以利用相关矩阵，发现任何2个连续特征之间线性关系（相关），确定研究我们独立预测因子之间的任何多重共线性
# pandas的相关性函数
total_corr = total.corr()
# plotly的热度图
total_corr_fig = px.imshow(total_corr,text_auto = True,aspect = 'auto',color_continuous_scale = 'RdBu_r')
# 存储为网页
total_corr_fig.write_html(r'./data/相关矩阵-合并数据集/total_corr.html')
# 在线展示
# total_corr_fig.show()
#从热度图可以看到，很多特征是存在多重共线性，一个个去观察排查很痛苦，这里给出一个简单的办法。

# multicollinearity :多重共线性
# 与1个特征具有多重共线性
one_mcl = []
# 与多个特征具有多重共线性
muti_mcl = []
# 将相关矩阵转换为dataframe
corrdf = pd.DataFrame(total_corr)
for i in list(corrdf.columns):
    # 提取出相关系数>0.8的数据
    dealdf = corrdf[corrdf[i] >= 0.8]
    # 获取当前index名称
    deal_list = list(dealdf.index)
    # 剔除自己本身特征，特征与自己本身的相关系数为1
    deal_list.remove(i)
    if deal_list is not None:
        if len(deal_list) > 1:
            muti_mcl.append(i)
        elif len(deal_list) == 1:
            one_mcl.append(i)
print('成功~')

print(muti_mcl)
print('------------------------------------------------')
print(f'与多个特征具有多重共线性的特征个数有：{len(muti_mcl)}')

print(one_mcl)
print('----------------------------------------------')
print(f'与单个特征具有多重共线性的特征个数有:{len(one_mcl)}')
